package model;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Set;

/**
 * Classe de estrutura para pedido do cliente da lavanderia
 * 
 * @author Dayane
 * @author Pedro Candido
 *
 * @since 28/04/12
 */

public class Pedido implements Serializable {
	
	/**
	 * Atributo para classe poder ser seiralizada
	 */
	private static final long serialVersionUID = -3150316727885350476L;

	/**
	 * Chave primaria do cliente (baseado em banco de dados).
	 * Sua posicao no HashMap a qual ele pertente.
	 */
	private int key;
	
	/**
	 * Atributos da classe qua guardam as informacoes do cliente
	 */
	private String dataLancamento;
	private int status;
	private double valorTotal = 0;
	
	/**
	 * Lista de produtos desse pedido. Acessando essa lista temos todos os produtos deswse pedido
	 * e podemos adicionar novos nela.
	 */
	private HashMap<Integer, Produto> produtos = new HashMap<Integer, Produto>();

	/*
	 * Getters e setters gerais
	 */	
	public int getKey() {
		return this.key;
	}
	public void setKey(int nextPedidoKey) {
		this.key = nextPedidoKey;
	}
	
	public String getDataLancamento() {
		return dataLancamento;
	}
	public void setDataLancamento(String dataLancamento) {
		this.dataLancamento = dataLancamento;
	}

	/*
	 * getStatus indica se o pedido foi finalizado (1), está em andamento (0) ou
	 * foi cancelado (-1)
	 */
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}

	public double getValorTotal() {
		return valorTotal;
	}
	public void sumValorTotal(double valor) {
		this.valorTotal = this.valorTotal+valor;
	}

	public HashMap<Integer, Produto> getProdutoList() {
		return produtos;
	}
	
	/**
	 * Adiciona um produto a lista de produtos do cliente
	 * 
	 * Se o produto ja estiver na lista, atualiza valor total e quantidade
	 * @param Produto prod - produto a ser incluido
	 * @param int qtd - quantidade desse produto
	 */
	public void addProduto(Produto prod) {
		if(this.produtos.containsKey(prod.getKey())){
			// pega prod aux
			Produto aux = this.produtos.get(prod.getKey());
			
			// retira valor do produto que já esta no pedido
			this.sumValorTotal(-(aux.getQtd() * aux.getPreco()));
			
			// Insere essa qtd no produto no hashd e produto
			aux.setQtd(prod.getQtd()+aux.getQtd());
			
			// Salva valor total
			this.sumValorTotal(aux.getPreco()*aux.getQtd());
		}else{
			// salvando pela primera vez produto
			this.produtos.put(prod.getKey(), prod);
			this.sumValorTotal(prod.getQtd() * prod.getPreco());
		}
		
	}
	
	/**
	 * Imprime as informacoes do pedido e de seus produtos
	 * @param boolean imprimirProdutos
	 * @return void
	 */
	public void imprimir(boolean imprimirProdutos){
		System.out.println("\t Codigo: "+ this.key);
		System.out.println("\t Data entrada: " + this.dataLancamento);
		System.out.println("\t Status: " + PedidoStatus.getStatus(this.status));
		
		if(imprimirProdutos){
			System.out.println("\t Produtos: ");
			Set<Integer> produtosKeys = this.produtos.keySet();
			for (int key : produtosKeys){
				this.getProdutoList().get(key).imprimirPeloPedido();
				System.out.println("");// apenas quebrando linha
			}
		}
		System.out.println("\t Valor total: " + this.valorTotal);
		System.out.println("_____________________________________________________________________________");
	}
}
